﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crosland.Automotriz.Core;
using System.Data.SqlClient;
using Crosland.Automotriz.Entidad;

namespace Crosland.Automotriz.Data.Dao.Linq
{
    public class clsTh_Procesoabc_DetDAO
    {
        AutomotrizEntities ContextoDeObjs = new AutomotrizEntities();
        private readonly DM_CROSLAND_20130417Entities ContextoEntidad = new DM_CROSLAND_20130417Entities();

        public List<TH_PROCESOABC_DET> listar()
        {

            List<TH_PROCESOABC_DET> lista = new List<TH_PROCESOABC_DET>();
            try
            {
                var q = from c in ContextoDeObjs.TH_PROCESOABC_DET
                        select c;
                lista = q.ToList();

            }
            catch (Exception)
            {
            }
            return lista;
        }

        public List<procesoABC> listTh_Procesarabc_Det(int nro_proceso, String idMarca, string desGrupo)
        {
            List<procesoABC> listaAbc = new List<procesoABC>();

            try
            {


                var queryText = "SELECT tl.ID_INVENTARIO_ABC_CAB,tm.ID_MATERIAL,tm.COD_MATERIAL, "+
                                "tl.TIPO_ABC_VENTA_VALORIZADO,tl.TIPO_ABC_VENTA_CANTIDAD, "+
                                "tm.DES_MATERIAL,tl.IMP_VENTA,tl.PORC_VENTA,tl.PORC_VENTA_ACUM, "+
                                "tl.CANTIDAD,tl.PORC_VENTA_CANT,tl.PORC_VENTA_CANT_ACUM "+
                                "FROM  T_LOG_INVENTARIO_ABC_DET TL "+
                                "INNER JOIN TD_MATERIAL tm ON tm.ID_MATERIAL = TL.ID_MATERIAL "+
                                "INNER JOIN TD_MODELO tm2 ON tm2.ID_MODELO = tm.ID_MODELO "+
                                "INNER JOIN TD_MARCA tm3 ON tm3.ID_MARCA = tm2.ID_MARCA "+
                                "INNER JOIN TD_GRUPO_ARTICULO tga ON tga.ID_GRUPO_ARTICULO = tm.ID_GRUPO_ARTICULO "+
                                "WHERE TL.ID_INVENTARIO_ABC_CAB="+nro_proceso+" AND tga.ID_GRUPO_ARTICULO IN(SELECT fatt.StrVal FROM dbo.FU_ArrayToTable('"+desGrupo+"') fatt) "+
                                "AND tm3.ID_MARCA IN (SELECT fatt.StrVal FROM dbo.FU_ArrayToTable('"+idMarca+"') fatt) "+
                                "ORDER BY TL.IMP_VENTA DESC";
                var q = ContextoDeObjs.ExecuteStoreQuery<procesoABC>(queryText);

                listaAbc = q.ToList();
                

                //var q = from tl in ContextoDeObjs.T_LOG_INVENTARIO_ABC_DET
                //        join tm in ContextoDeObjs.TD_MATERIAL on tl.ID_MATERIAL equals tm.ID_MATERIAL
                //        join tmo in ContextoDeObjs.TD_MODELO on tm.ID_MODELO equals tmo.ID_MODELO
                //        join tma in ContextoDeObjs.TD_MARCA on tmo.ID_MARCA equals tma.ID_MARCA
                //        join tg in ContextoDeObjs.TD_GRUPO_ARTICULO on tm.ID_GRUPO_ARTICULO equals tg.ID_GRUPO_ARTICULO
                //        where tl.ID_INVENTARIO_ABC_CAB == nro_proceso
                //        && tg.DES_GRUPO_ARTICULO_2 == desGrupo
                //        && tma.ID_MARCA == idMarca
                //        orderby tl.IMP_VENTA descending
                //        select new
                //        {
                //            tl.ID_INVENTARIO_ABC_CAB,
                //            tm.ID_MATERIAL,
                //            tm.COD_MATERIAL,
                //            tl.TIPO_ABC_VENTA_VALORIZADO,
                //            tl.TIPO_ABC_VENTA_CANTIDAD,
                //            tm.DES_MATERIAL,
                //            tl.IMP_VENTA,
                //            tl.PORC_VENTA,
                //            tl.PORC_VENTA_ACUM,
                //            tl.CANTIDAD,
                //            tl.PORC_VENTA_CANT,
                //            tl.PORC_VENTA_CANT_ACUM
                //        };

                //foreach (var myEntity in q.ToArray())
                //{
                //    procesoABC abc = new procesoABC();
                //    abc.ID_INVENTARIO_ABC_CAB = myEntity.ID_INVENTARIO_ABC_CAB;
                //    abc.COD_MATERIAL = myEntity.COD_MATERIAL;
                //    abc.TIPO_ABC_VENTA_VALORIZADO = myEntity.TIPO_ABC_VENTA_VALORIZADO;
                //    abc.TIPO_ABC_VENTA_CANTIDAD = myEntity.TIPO_ABC_VENTA_CANTIDAD;
                //    abc.DES_MATERIAL = myEntity.DES_MATERIAL;
                //    abc.IMP_VENTA = myEntity.IMP_VENTA;
                //    abc.PORC_VENTA = myEntity.PORC_VENTA;
                //    abc.PORC_VENTA_ACUM = myEntity.PORC_VENTA_ACUM;
                //    abc.CANTIDAD = myEntity.CANTIDAD;
                //    abc.PORC_VENTA_CANT = myEntity.PORC_VENTA_CANT;
                //    abc.PORC_VENTA_CANT_ACUM = myEntity.PORC_VENTA_CANT_ACUM;
                //    abc.ID_MATERIAL = myEntity.ID_MATERIAL;
                //    listaAbc.Add(abc);
                //}
            }
            catch
            {

            }
            return listaAbc;
           
        }






        public bool deleteTh_proceso_abc_det(int nro_proceso)
        {


            try
            {


                ContextoDeObjs.ExecuteStoreCommand("UPDATE TH_PROCESOABC_CAB SET ESTADO=1 WHERE NUM_PROC=" + nro_proceso);
                return true;

            }
            catch (SqlException ex)
            {

                Globales.msjSql = ex.Message;
                return false;
            }

            catch
            {
                return false;

            }


        }


        public IEnumerable<Object> ListarTipo(int id_inventario_cab)
        {
            IEnumerable<Object> Lista = new List<Object>();

            var q = (from ti in ContextoDeObjs.T_LOG_INVENTARIO_ABC_DET
                     join tm in ContextoDeObjs.TD_MATERIAL on ti.ID_MATERIAL equals tm.ID_MATERIAL
                     join tg in ContextoDeObjs.TD_GRUPO_ARTICULO on tm.ID_GRUPO_ARTICULO equals tg.ID_GRUPO_ARTICULO
                     where ti.ID_INVENTARIO_ABC_CAB == id_inventario_cab
                     orderby tg.DES_GRUPO_ARTICULO_2 descending
                     select new
                     {
                         tg.DES_GRUPO_ARTICULO_2

                     }).Distinct().OrderByDescending(tg => tg.DES_GRUPO_ARTICULO_2);

            Lista = q.ToList();
            return Lista;
        }



        public List<TD_GRUPO_ARTICULO_EN> listaGrupoArticulo(int id_cab, String Des_sup)
        {

            List<TD_GRUPO_ARTICULO_EN> lis = new List<TD_GRUPO_ARTICULO_EN>();
            try
            {
                var queryText = "SELECT DISTINCT tga.ID_GRUPO_ARTICULO, TGA.DES_GRUPO_ARTICULO " +
                                    "FROM T_LOG_INVENTARIO_ABC_DET L " +
                                    "INNER JOIN TD_MATERIAL tm ON tm.ID_MATERIAL = L.ID_MATERIAL " +
                                    "INNER JOIN TD_GRUPO_ARTICULO tga ON tga.ID_GRUPO_ARTICULO = tm.ID_GRUPO_ARTICULO " +
                                     "WHERE L.ID_INVENTARIO_ABC_CAB="+id_cab+" AND tga.DES_GRUPO_ARTICULO_2 IN(SELECT * FROM dbo.FU_ArrayToTable('"+Des_sup+"') fatt)";
                var q = ContextoDeObjs.ExecuteStoreQuery<TD_GRUPO_ARTICULO_EN>(queryText).ToList();

                lis = q.ToList();
                return lis;
            }
            catch (Exception)
            {
                return null;
            }
        
        }





        public List<TD_MARCA_EN> listaMarcaPorIdGrupoArticulo(int id_cab,String id_grupo_Articulos)
        {

            List<TD_MARCA_EN> lis = new List<TD_MARCA_EN>();
            try
            {
                var queryText = "SELECT DISTINCT  tm2.ID_MARCA,tm2.DES_MARCA " +
                                    "FROM T_LOG_INVENTARIO_ABC_DET L " +
                                    "INNER JOIN TD_MATERIAL tm ON tm.ID_MATERIAL = L.ID_MATERIAL  INNER JOIN TD_MODELO tm2 ON tm2.ID_MODELO = tm.ID_MODELO " +
                                    "INNER JOIN TD_GRUPO_ARTICULO tga ON tga.ID_GRUPO_ARTICULO = tm.ID_GRUPO_ARTICULO " +
                                     "WHERE L.ID_INVENTARIO_ABC_CAB=" + id_cab + " AND tga.ID_GRUPO_ARTICULO IN (SELECT * FROM dbo.FU_ArrayToTable('" + id_grupo_Articulos + "') fatt)";
                var q = ContextoDeObjs.ExecuteStoreQuery<TD_MARCA_EN>(queryText).ToList();

                lis = q.ToList();
                return lis;
            }
            catch (Exception)
            {
                return null;
            }
        
        }




        public IEnumerable<Object> ListarMarca()
        {
            IEnumerable<Object> Lista = new List<Object>();

            var q = (from ti in ContextoDeObjs.T_LOG_INVENTARIO_ABC_DET
                     join tm in ContextoDeObjs.TD_MATERIAL
                     on ti.ID_MATERIAL equals tm.ID_MATERIAL
                     join td in ContextoDeObjs.TD_MODELO
                     on tm.ID_MODELO equals td.ID_MODELO
                     join tma in ContextoDeObjs.TD_MARCA
                     on td.ID_MARCA equals tma.ID_MARCA
                     select new
                     {
                         tma.DES_MARCA,
                         tma.ID_MARCA
                     }).Distinct().OrderBy(tma => tma.DES_MARCA);

            Lista = q.ToList();

            return Lista;


        }

        public List<TD_CANTIDADES_ABC> TotalABCValorizado(int idCab, String idMarca, string desGrupo)
        {
            var p = new object[] { new SqlParameter("@ID_CAB", idCab), new SqlParameter("@ID_MARCA", idMarca), new SqlParameter("@DES_GRUPO", desGrupo) };
            var resultado = ContextoEntidad.ExecuteStoreQuery<TD_CANTIDADES_ABC>("exec USP_CANTIDAD_ABC_VALORIZADO @ID_CAB,@ID_MARCA,@DES_GRUPO", p).AsQueryable().ToList();
            return resultado;
        }

        public List<TD_CANTIDADES_ABC> TotalABCCantidades(int idCab, String idMarca, string desGrupo)
        {
            var p = new object[] { new SqlParameter("@ID_CAB", idCab), new SqlParameter("@ID_MARCA", idMarca), new SqlParameter("@DES_GRUPO", desGrupo) };
            var resultado = ContextoEntidad.ExecuteStoreQuery<TD_CANTIDADES_ABC>("exec USP_CANTIDAD_ABC_CANTIDAD @ID_CAB,@ID_MARCA,@DES_GRUPO", p).AsQueryable().ToList();
            return resultado;
        }

        public bool AnularProcesoABC(int idCab)
        {

            ContextoDeObjs.ExecuteStoreCommand("exec USP_PROCESO_ABC_ANULAR @ID_INVENTARIO_ABC_CAB={0}", idCab);
            return true;

        }






    }
}
